<?php
	use dayscript\event\EventDispatcher;
	use dayscript\Application;
	use dayscript\util\Debug;
	use dayscript\event\Event;
	
	require_once( '../_config/base.inc.php' );
	
	Application::getInstance( BASE_DIR . '_config/tests.inc.php' );
	
	//http://www.adobe.com/livedocs/flash/9.0/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00000138.html
	
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
	<title>Manejo de eventos</title>
	<link rel="stylesheet" type="text/css" media="all" href="../_resources/styles.css" />
</head>
<body>
<h1>Manejo de eventos</h1>

<h3>Evento (Event)</h3>
Un evento es una notificaci&oacute;n que ocurre como respuesta a una acci&oacute;n o como parte de una condici&oacute;n.

<h3>Manejador de evento (Event Handler)</h3>
Fragmento en el programa que reacciona a los eventos ocurridos.

<h3>Despachador de evento (Event Dispatcher)</h3>
Elemento o ente que realiza las acciones y crea las las notificaciones (Eventos).

<h1>Men&uacute;</h1>
	<ul>
		<li><a href="#CicloDeVida">Ciclo de vida de un evento</a></li>
		<li><a href="#Handling">Manipulando eventos</a></li>
		<li><a href="#Tasks">Tareas comunes en la manipulaci&oacute;n de eventos</a></li>
	</ul>

<h2>Ciclo de vida de un evento <a name="CicloDeVida" href="#"><b> &uArr; Subir </b></a></h2>
Un evento tiene un ciclo de vida que inicia con la acci&oacute;n o condici&oacute;n que lo crea y termina con la respuesta final dada por el Manejador. De no existir un Manejador el evento finaliza justo despu&eacute;s de iniciar.<br />
El ciclo de vida de un evento com&uacute;n es el siguiente:
<ol>
	<li>Acci&oacute;n o condici&oacute;n para que el evento ocurra.</li>
	<li>El Objecto Event es actualizado de forma instant&aacute;nea para reflejar las condiciones del evento. </li>
	<li>Se &quot;dispara&quot; el evento. Esta es la notificaci&oacute;n en respuesta al evento.</li>
	<li>Se realiza el llamado a cada uno de los manejadores de eventos en el orden dado por su prioridad o seg&uacute;n se hayan creado, cada uno realiza sus acciones y retorna.</li>
	<li>A diferencia de DOM (Document Object Model) en donde el evento se transfiere &quot;hacia arriba&quot; al siguiente elemento en la jerarqu&iacute;a (bubbles up) y se hace el llamado al Manejador de ese elemento hasta terminar la jeraqu&iacute;a o hasta que el evento es cancelado, en DFramework el evento recorre todos los Manejadores en el orden &quot;Inicial&quot; y luego se realiza el recorrido en el orden contrario (blubbles back) seg&uacute;n se defina en la propiedad <i>bubbles</i> del evento, el recorrido total se temina en cualquier momento si un Manejador cancela el evento (en caso de ser permitido) o al terminar el bubbling.</li>
	<li>La acci&oacute;n final del evento es realizada, si la tiene y no fue cancelada por un Manejador. </li>
</ol>
<h2>Manipulando eventos<a name="Handling" href="#"><b> &uArr; Subir </b></a></h2>
En DFramework cada evento est&aacute; representado por una instancia de la clase event/Event o una de sus subclases.<br />
<blockquote>
<?php
	$event = new Event( );
	Debug::dumpObject( $event, true );
?>
</blockquote>
Tras la creaci&oacute;n de un evento el paso siguiente es &ldquo;dispararlo&rdquo; (dispatch), lo que significa que el objeto evento es pasado al objeto que es su objetivo/destino (target).
<br />
El objeto que actua como destino para un evento disparado es llamado &ldquo;objetivo&rdquo; (event target).
<br />
Por ejemplo, cuando un m&oacute;dulo es cargado, la aplicaci&oacute;n dispara un evento directamente al objetivo, que en este caso, es el m&oacute;dulo cargado.  
<br />
<br />
Es posible &ldquo;escuchar&rdquo; (listen) eventos espec&iacute;ficos en el c&oacute;digo usando &ldquo;oyentes&rdquo; (listeners).
<br />
Los listeners son funciones o m&eacute;todos que se escriben para responder a eventos espec&iacute;ficos, para asegurar que su programa responde a los eventos, debe agregar los listeners a las instancias de objeto correctas NO a las clases, sus super-clases, sub-clases ni objetos contenedores.
<br />
<br />
Cada vez que se escriba un listener, deber&aacute; seguir una estructura b&aacute;sica:
<blockquote>
<?php
highlight_string( 
<<<CODE
<?php
	function respondeEvento( Event \$evento )	{
		// Acciones a realizar en respuesta al evento...
		echo \$evento . "<br />";
	}
	
	// Creando objeto disparador de eventos (target)
	\$eventTarget = new EventDispatcher ( );
	
	// Agregando listeners
	\$eventTarget->addEventListener( \$eventTarget, 'INIT', respondeEvento );
	\$eventTarget->addEventListener( \$eventTarget, 'START', respondeEvento );
	\$eventTarget->addEventListener( \$eventTarget, 'OTHER', respondeEvento );
	
	// Disparando eventos
	\$eventTarget->dispatchEvent( new Event( 'START' ) );
	\$eventTarget->dispatchEvent( new Event( 'OTHER' ) );
	\$eventTarget->dispatchEvent( new Event( 'ERROR' ) );	// No hay listener para este tipo de evento
	\$eventTarget->dispatchEvent( new Event( 'INIT' ) );
?>
CODE
);
?>
</blockquote>
<blockquote>
<?php
	function respondeEvento( Event $evento )	{
		echo $evento . "<br />";
	}
	
	$eventTarget = new EventDispatcher ( );
	$eventTarget->addEventListener( $eventTarget, 'INIT', respondeEvento );
	$eventTarget->addEventListener( $eventTarget, 'START', respondeEvento );
	$eventTarget->addEventListener( $eventTarget, 'OTHER', respondeEvento );
	
	$eventTarget->dispatchEvent( new Event( 'START' ) );
	$eventTarget->dispatchEvent( new Event( 'OTHER' ) );
	$eventTarget->dispatchEvent( new Event( 'ERROR' ) );
	$eventTarget->dispatchEvent( new Event( 'INIT' ) );
?>
</blockquote>
<h2>Tareas comunes en la manipulaci&oacute;n de eventos<a name="Tasks" href="#"><b> &uArr; Subir </b></a></h2>
Las siguientes tareas ser&aacute;n descritas posteriormente.
<ul>
	<li>Como responder a eventos</li>
	<li>Como dejar de responder a eventos</li>
	<li>Los objetos Event</li>
	<li>El ciclo de vida (flujo) del evento
		<ul>
			<li>Informaci&oacute;n de flujo</li>
			<li>Detener el flujo</li>
			<li>Acci&oacute;n por defecto</li>
			<li>Prevenir acci&oacute;n por defecto</li>
		</ul>
	</li>
	<li>Disparando eventos desde una clase</li>
	<li>Creando nuevos tipos de eventos</li>
</ul>
</body>
</html>